home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / esc.jar / com / extensibility / xml / XDRReader.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-06-30  |  18.2 KB  |  834 lines

  1. package com.extensibility.xml;
  2.  
  3. import com.extensibility.util.StringUtilities;
  4. import com.extensibility.xml.dt.DataType;
  5. import com.extensibility.xml.dt.DataTypeFactory;
  6. import com.extensibility.xml.dt.DataTypeIntf;
  7. import com.extensibility.xml.sax.BufferedHandlerBase;
  8. import java.io.IOException;
  9. import java.io.Reader;
  10. import java.util.Hashtable;
  11. import java.util.Stack;
  12. import java.util.Vector;
  13. import org.xml.sax.AttributeList;
  14. import org.xml.sax.InputSource;
  15. import org.xml.sax.Locator;
  16. import org.xml.sax.Parser;
  17. import org.xml.sax.SAXException;
  18. import org.xml.sax.SAXParseException;
  19. import org.xml.sax.helpers.LocatorImpl;
  20.  
  21. public final class XDRReader extends BufferedHandlerBase {
  22.    static final String TOPLEVEL_ELEMTYPE = "ElementType";
  23.    static final String TOPLEVEL_ATTRTYPE = "AttributeType";
  24.    static final String TAG_ELEMENT = "element";
  25.    static final String TAG_ATTRIBUTE = "attribute";
  26.    static final String TAG_GROUP = "group";
  27.    static final String TAG_COMMENT = "description";
  28.    static final String TAG_DATATYPE = "datatype";
  29.    private Hashtable elemDecls;
  30.    private Hashtable globalAttrs;
  31.    private ElementDeclaration currentElemDecl;
  32.    private AttributeDeclaration currentAttrDecl;
  33.    private Vector localAttrsRefGlobal;
  34.    private Hashtable localAttrs;
  35.    private Hashtable namespaces;
  36.    private SchemaIntf schema;
  37.    private ContentModel currentCM;
  38.    private boolean cmClosed;
  39.    private Stack cmConnectors;
  40.    private Stack contentModels;
  41.    private Object commentKind;
  42.    private Stack attrStack = new Stack();
  43.    private StringBuffer currentText;
  44.    private boolean isFirstGroup;
  45.    private boolean canDeleteFirstGroup;
  46.    private int groupLevel;
  47.    private boolean gotSchemaRoot;
  48.    private boolean inProlog = true;
  49.    private Locator locator;
  50.  
  51.    public XDRReader(SchemaIntf var1) {
  52.       this.schema = var1;
  53.    }
  54.  
  55.    public void error(String var1, int var2, int var3, int var4) {
  56.       ParserException var5 = new ParserException(var2, var1);
  57.       var5.setSource(String.valueOf(String.valueOf(String.valueOf(String.valueOf("See Line: ").concat(String.valueOf(var3))).concat(String.valueOf(" at Column:"))).concat(String.valueOf(var4))).concat(String.valueOf(" in file.")));
  58.       var5.setSourceLinePos(var3);
  59.       if (this.schema.getShowErrors() && this.currentAttrDecl != null) {
  60.          this.currentAttrDecl.addError(var5);
  61.       } else if (this.schema.getShowErrors() && this.currentElemDecl != null) {
  62.          this.currentElemDecl.addError(var5);
  63.       } else {
  64.          this.schema.addError(var5);
  65.       }
  66.  
  67.    }
  68.  
  69.    public void error(SAXParseException var1) {
  70.       ParserException var2 = new ParserException(240, ((SAXException)var1).getMessage());
  71.       var2.setSource(String.valueOf(String.valueOf(String.valueOf(String.valueOf("See Line: ").concat(String.valueOf(this.locator.getLineNumber()))).concat(String.valueOf(" at Column:"))).concat(String.valueOf(this.locator.getColumnNumber()))).concat(String.valueOf(" in file.")));
  72.       var2.setSourceLinePos(this.locator.getLineNumber());
  73.       this.schema.addError(var2);
  74.    }
  75.  
  76.    public void fatalError(SAXParseException var1) {
  77.       this.error(var1);
  78.    }
  79.  
  80.    public void setDocumentLocator(Locator var1) {
  81.       this.locator = var1;
  82.    }
  83.  
  84.    public DataType createDataType(String var1) {
  85.       if (var1.equals("id")) {
  86.          var1 = DataTypeIntf.ID;
  87.       } else if (var1.equals("idref")) {
  88.          var1 = DataTypeIntf.IDREF;
  89.       } else if (var1.equals("idrefs")) {
  90.          var1 = DataTypeIntf.IDREFS;
  91.       } else if (var1.equals("entity")) {
  92.          var1 = DataTypeIntf.ENTITY;
  93.       } else if (var1.equals("entities")) {
  94.          var1 = DataTypeIntf.ENTITIES;
  95.       } else if (var1.equals("nmtoken")) {
  96.          var1 = DataTypeIntf.NMTOKEN;
  97.       } else if (var1.equals("nmtokens")) {
  98.          var1 = DataTypeIntf.NMTOKENS;
  99.       } else if (var1.equals("enumeration")) {
  100.          var1 = DataTypeIntf.ENUMERATION;
  101.       } else if (var1.equals("notation")) {
  102.          var1 = DataTypeIntf.NOTATION;
  103.       } else if (!DataTypeFactory.isKnown(var1)) {
  104.          this.error(var1, 250, this.locator.getLineNumber(), this.locator.getColumnNumber());
  105.          var1 = DataTypeIntf.STRING;
  106.       }
  107.  
  108.       return DataTypeFactory.createDataType(var1);
  109.    }
  110.  
  111.    public void parse(URI var1) throws IOException {
  112.       Reader var2 = var1.createReader();
  113.       this.parse(var2);
  114.    }
  115.  
  116.    public void parse(Reader var1) throws IOException {
  117.       try {
  118.          Parser var2 = SchemaUtilities.getParser();
  119.          this.setDocumentLocator(new LocatorImpl());
  120.          var2.setEntityResolver(this);
  121.          var2.setErrorHandler(this);
  122.          var2.setDocumentHandler(this);
  123.          var2.parse(new InputSource(var1));
  124.       } catch (IOException var5) {
  125.          SAXParseException var7 = new SAXParseException("IO Exception", this.locator, var5);
  126.          this.error(var7);
  127.       } catch (Exception var6) {
  128.          SAXParseException var4 = new SAXParseException("Parser Exception", this.locator, var6);
  129.          this.error(var4);
  130.       }
  131.  
  132.    }
  133.  
  134.    public void startDocument() {
  135.       this.elemDecls = new Hashtable();
  136.       this.globalAttrs = new Hashtable();
  137.       this.currentElemDecl = null;
  138.       this.localAttrsRefGlobal = new Vector();
  139.       this.localAttrs = new Hashtable();
  140.       this.namespaces = new Hashtable();
  141.       this.cmClosed = false;
  142.       this.cmConnectors = new Stack();
  143.       this.contentModels = new Stack();
  144.       this.commentKind = null;
  145.       this.currentText = new StringBuffer();
  146.       this.gotSchemaRoot = false;
  147.    }
  148.  
  149.    public void endDocument() {
  150.    }
  151.  
  152.    public void processingInstruction(String var1, String var2) throws SAXException {
  153.       ProcessingInstruction var3 = new ProcessingInstruction(var1, var2);
  154.       if (this.inProlog) {
  155.          ((BaseDeclaration)var3).setIsInProlog(true);
  156.       }
  157.  
  158.       this.schema.insertDeclaration(var3, (BaseDeclaration)null);
  159.    }
  160.  
  161.    public void startElement(String var1, AttributeList var2) {
  162.       this.inProlog = false;
  163.       this.currentText.setLength(0);
  164.       if (((BufferedHandlerBase)this).isSavingXML()) {
  165.          super.startElement(var1, var2);
  166.       } else {
  167.          this.parseElement(var1, var2);
  168.          this.attrStack.push(var2);
  169.       }
  170.    }
  171.  
  172.    private void doSchemaNode(AttributeList var1) {
  173.       for(int var2 = 0; var2 < var1.getLength(); ++var2) {
  174.          String var3 = var1.getName(var2);
  175.          if (var3.startsWith("xmlns:")) {
  176.             String var4 = var3.substring(6, var3.length());
  177.             if (var4.indexOf("dt") == -1) {
  178.                String var5 = var1.getValue(var2);
  179.                NamespaceDeclaration var6 = new NamespaceDeclaration(var4, var5);
  180.                this.schema.insertDeclaration(var6, (BaseDeclaration)null);
  181.                this.namespaces.put(var5, var4);
  182.             }
  183.          }
  184.       }
  185.  
  186.       this.addMetaProps(var1);
  187.    }
  188.  
  189.    private char getCurrentConnection() {
  190.       return (Character)this.cmConnectors.peek();
  191.    }
  192.  
  193.    private ContentModelTerm getCurrentParent() {
  194.       return this.contentModels.empty() ? null : (ContentModelTerm)this.contentModels.peek();
  195.    }
  196.  
  197.    private void doElementTypeNode(AttributeList var1) {
  198.       String var2 = null;
  199.       String var3 = null;
  200.       String var4 = null;
  201.       String var5 = null;
  202.       String var6 = null;
  203.  
  204.       for(int var7 = 0; var7 < var1.getLength(); ++var7) {
  205.          String var8 = var1.getName(var7);
  206.          if (var8.equals("name")) {
  207.             var2 = var1.getValue(var7);
  208.          } else if (var8.equals("content")) {
  209.             var3 = var1.getValue(var7);
  210.          } else if (var8.equals("model")) {
  211.             var4 = var1.getValue(var7);
  212.          } else if (var8.equals("order")) {
  213.             var5 = var1.getValue(var7);
  214.          } else if (var8.equals("dt:type")) {
  215.             var6 = var1.getValue(var7);
  216.          } else if (var8.indexOf(":") == -1) {
  217.             this.error(var8, 252, this.locator.getLineNumber(), this.locator.getColumnNumber());
  218.          }
  219.       }
  220.  
  221.       this.groupLevel = 0;
  222.       this.isFirstGroup = true;
  223.       this.canDeleteFirstGroup = false;
  224.       if (var2 == null) {
  225.          var2 = new String("UNDEFINED");
  226.          this.error("ElementType", 202, this.locator.getLineNumber(), this.locator.getColumnNumber());
  227.       }
  228.  
  229.       if (var3 == null) {
  230.          var3 = new String("mixed");
  231.       }
  232.  
  233.       if (var4 == null) {
  234.          var4 = new String("open");
  235.       }
  236.  
  237.       if (this.elemDecls.containsKey(var2)) {
  238.          this.currentElemDecl = (ElementDeclaration)this.elemDecls.get(var2);
  239.          this.error(var2, 206, this.locator.getLineNumber(), this.locator.getColumnNumber());
  240.       } else {
  241.          this.currentElemDecl = new ElementDeclaration(var2, 3);
  242.          this.elemDecls.put(var2, this.currentElemDecl);
  243.       }
  244.  
  245.       this.addMetaProps(this.currentElemDecl, var1);
  246.       this.currentCM = this.currentElemDecl.getContentModel();
  247.       this.currentCM.setOpen(var4.toString().equals("open"));
  248.       if (var3.toString().equals("empty")) {
  249.          this.currentCM.setContentModel(3);
  250.          this.cmClosed = true;
  251.       } else if (var3.toString().equals("textOnly")) {
  252.          this.currentCM.setContentModel(5);
  253.          if (var6 != null) {
  254.             this.currentElemDecl.setDataType(this.createDataType(var6));
  255.          }
  256.  
  257.          this.cmClosed = true;
  258.       } else {
  259.          Object var9 = null;
  260.          ContentModelTerm var10;
  261.          if (var3.toString().equals("eltOnly")) {
  262.             this.currentCM.setContentModel(6);
  263.             var10 = this.currentCM.getRootGroup();
  264.             if (var5 == null) {
  265.                var5 = "seq";
  266.             }
  267.  
  268.             if (var5.equals("many")) {
  269.                var10.setOccurance('*');
  270.             }
  271.          } else if (var3.toString().equals("mixed")) {
  272.             this.currentCM.setContentModel(2);
  273.             var10 = this.currentCM.getRootGroup();
  274.             if (var5 == null) {
  275.                var5 = "many";
  276.             }
  277.  
  278.             if (!var5.toString().equals("many")) {
  279.                this.error(var5, 253, this.locator.getLineNumber(), this.locator.getColumnNumber());
  280.             }
  281.          } else {
  282.             this.error(var3, 251, this.locator.getLineNumber(), this.locator.getColumnNumber());
  283.             this.currentCM.setContentModel(2);
  284.             var10 = this.currentCM.getRootGroup();
  285.             if (var5 == null) {
  286.                var5 = "many";
  287.             }
  288.          }
  289.  
  290.          this.cmConnectors.push(this.getConnector(var5));
  291.          if (var10 != null) {
  292.             this.contentModels.push(var10);
  293.          }
  294.       }
  295.  
  296.    }
  297.  
  298.    private void doAttributeTypeNode(AttributeList var1) {
  299.       String var2 = null;
  300.       String var3 = null;
  301.       String var4 = null;
  302.       String var5 = null;
  303.       String var6 = null;
  304.  
  305.       for(int var7 = 0; var7 < var1.getLength(); ++var7) {
  306.          String var8 = var1.getName(var7);
  307.          if (var8.equals("name")) {
  308.             var2 = var1.getValue(var7);
  309.          } else if (var8.equals("dt:type")) {
  310.             var3 = var1.getValue(var7);
  311.          } else if (var8.equals("dt:values")) {
  312.             var4 = var1.getValue(var7);
  313.          } else if (var8.equals("default")) {
  314.             var5 = var1.getValue(var7);
  315.          } else if (var8.equals("required")) {
  316.             var6 = var1.getValue(var7);
  317.          } else if (var8.indexOf(":") == -1) {
  318.             this.error(var8, 252, this.locator.getLineNumber(), this.locator.getColumnNumber());
  319.          }
  320.       }
  321.  
  322.       if (var2 == null) {
  323.          var2 = new String("UNDEFINED");
  324.          this.error("AttributeType", 202, this.locator.getLineNumber(), this.locator.getColumnNumber());
  325.       }
  326.  
  327.       DataType var12;
  328.       if (var3 != null) {
  329.          var12 = this.createDataType(var3);
  330.       } else {
  331.          var12 = DataTypeFactory.createDataType(1);
  332.       }
  333.  
  334.       Vector var9 = null;
  335.       if (var4 != null) {
  336.          if (var3 != null && !var3.equals("enumeration") && !var3.equals("notation")) {
  337.             this.error(var4, 254, this.locator.getLineNumber(), this.locator.getColumnNumber());
  338.          }
  339.  
  340.          var9 = StringUtilities.parseNames(var4);
  341.       }
  342.  
  343.       boolean var10 = false;
  344.       if (var6 != null) {
  345.          if (((String)var6).equals("yes")) {
  346.             var10 = true;
  347.          } else if (!((String)var6).equals("no")) {
  348.             this.error(var6, 262, this.locator.getLineNumber(), this.locator.getColumnNumber());
  349.          }
  350.       }
  351.  
  352.       AttributeDeclaration var11 = new AttributeDeclaration(this.currentElemDecl, var2, var12, var9, var10, var5);
  353.       this.currentAttrDecl = var11;
  354.       if (this.currentElemDecl == null) {
  355.          this.globalAttrs.put(var2, var11);
  356.       } else {
  357.          this.localAttrs.put(var2, var11);
  358.       }
  359.  
  360.       this.addMetaProps(var11, var1);
  361.    }
  362.  
  363.    private void appendMetaProp(BaseDeclaration var1, String var2, String var3) {
  364.       if (var1 != null) {
  365.          var1.appendMetaProp(var2, var3);
  366.       } else {
  367.          this.schema.getMetaPropHash().appendMetaProp(var2, var3);
  368.       }
  369.  
  370.    }
  371.  
  372.    private void addMetaProp(BaseDeclaration var1, String var2, AttributeList var3) {
  373.       Hashtable var4 = new Hashtable();
  374.  
  375.       for(int var5 = 0; var5 < var3.getLength(); ++var5) {
  376.          var4.put(var3.getName(var5), var3.getValue(var5));
  377.       }
  378.  
  379.       if (var1 != null) {
  380.          var1.putMetaPropAttrs(var2, var4);
  381.       } else {
  382.          this.schema.getMetaPropHash().putMetaPropAttrs(var2, var4);
  383.       }
  384.  
  385.    }
  386.  
  387.    private void addMetaProps(BaseDeclaration var1, AttributeList var2) {
  388.       for(int var3 = 0; var3 < var2.getLength(); ++var3) {
  389.          String var4 = var2.getName(var3);
  390.          if (var4.indexOf(58) > 0 && var4.indexOf("xmlns") != 0 && var4.indexOf("dt:") != 0) {
  391.             var1.putMetaProp(var4, var2.getValue(var3));
  392.          }
  393.       }
  394.  
  395.    }
  396.  
  397.    private void addMetaProps(AttributeList var1) {
  398.       for(int var2 = 0; var2 < var1.getLength(); ++var2) {
  399.          String var3 = var1.getName(var2);
  400.          if (var3.indexOf(58) > 0 && var3.indexOf("xmlns") != 0 && var3.indexOf("dt:") != 0) {
  401.             this.schema.getMetaPropHash().putMetaProp(var3, var1.getValue(var2));
  402.          }
  403.       }
  404.  
  405.    }
  406.  
  407.    private void addCPMetaProps(ElementDeclaration var1, String var2, AttributeList var3) {
  408.       for(int var4 = 0; var4 < var3.getLength(); ++var4) {
  409.          String var5 = var3.getName(var4);
  410.          if (var5.indexOf(58) > 0 && var5.indexOf("xmlns") != 0) {
  411.             var1.putCPMetaProp(var2, var5, var3.getValue(var4));
  412.          }
  413.       }
  414.  
  415.    }
  416.  
  417.    private void doAttrOverride(AttributeDeclaration var1, AttributeDeclaration var2, String var3, String var4, int var5) {
  418.       if (var3 != null) {
  419.          var2.setDefault(var3);
  420.       } else if (var1 != null) {
  421.          var2.setDefault(var1.getDefault());
  422.       }
  423.  
  424.       if (var4 != null) {
  425.          if (var4.equals("yes")) {
  426.             var2.setRequired(true);
  427.          } else if (var4.equals("no")) {
  428.             var2.setRequired(false);
  429.          } else {
  430.             this.error(var4, 262, var5, 0);
  431.          }
  432.       } else if (var1 != null) {
  433.          var2.setRequired(var1.getRequired());
  434.       }
  435.  
  436.    }
  437.  
  438.    private void doAttributeNodeOverrides(AttributeDeclaration var1, AttributeList var2) {
  439.       String var3 = null;
  440.       String var4 = null;
  441.  
  442.       for(int var5 = 0; var5 < var2.getLength(); ++var5) {
  443.          String var6 = var2.getName(var5);
  444.          String var7 = var2.getValue(var5);
  445.          if (var6.equals("default")) {
  446.             var3 = var7;
  447.          } else if (var6.equals("required")) {
  448.             var4 = var7;
  449.          }
  450.       }
  451.  
  452.       this.doAttrOverride((AttributeDeclaration)null, var1, var3, var4, this.locator.getLineNumber());
  453.    }
  454.  
  455.    private void createLocalRefAttr(AttributeDeclaration var1, AttributeRefGlobalInfo var2, boolean var3) {
  456.       AttributeDeclaration var4 = (AttributeDeclaration)var1.clone(var2.elementDecl);
  457.       var4.setReference(true);
  458.       this.doAttrOverride(var1, var4, var2.attrDefault, var2.attrRequired, var2.linenumber);
  459.       if (var3) {
  460.          this.schema.insertDeclaration(var4, (BaseDeclaration)null);
  461.       }
  462.  
  463.    }
  464.  
  465.    private void doAttributeNode(AttributeList var1) {
  466.       String var2 = null;
  467.       String var3 = null;
  468.       String var4 = null;
  469.  
  470.       for(int var5 = 0; var5 < var1.getLength(); ++var5) {
  471.          String var6 = var1.getName(var5);
  472.          if (var6.equals("type")) {
  473.             var2 = var1.getValue(var5);
  474.          } else if (var6.equals("default")) {
  475.             var3 = var1.getValue(var5);
  476.          } else if (var6.equals("required")) {
  477.             var4 = var1.getValue(var5);
  478.          } else if (var6.indexOf(58) < 0) {
  479.             this.error(var6, 252, this.locator.getLineNumber(), this.locator.getColumnNumber());
  480.          }
  481.       }
  482.  
  483.       if (var2 == null) {
  484.          new String("UNDEFINED");
  485.          this.error("attribute", 202, this.locator.getLineNumber(), this.locator.getColumnNumber());
  486.       } else if (this.localAttrs.containsKey(var2)) {
  487.          AttributeDeclaration var8 = (AttributeDeclaration)this.localAttrs.get(var2);
  488.          this.doAttributeNodeOverrides(var8, var1);
  489.          this.addMetaProps(var8, var1);
  490.       } else if (this.globalAttrs.containsKey(var2)) {
  491.          AttributeDeclaration var9 = (AttributeDeclaration)this.globalAttrs.get(var2);
  492.          AttributeRefGlobalInfo var7 = new AttributeRefGlobalInfo(var2, this.currentElemDecl, var3, var4, 0);
  493.          this.createLocalRefAttr(var9, var7, false);
  494.       } else if (var2.indexOf(":") > 0) {
  495.          String var10 = var2.substring(0, var2.indexOf(":"));
  496.          String var11 = var2.substring(var2.indexOf(":") + 1, var2.length());
  497.          if (!this.namespaces.contains(var10)) {
  498.             this.error(String.valueOf(String.valueOf(var2).concat(String.valueOf(", "))).concat(String.valueOf(var10)), 241, this.locator.getLineNumber(), this.locator.getColumnNumber());
  499.          }
  500.       } else {
  501.          this.localAttrsRefGlobal.addElement(new AttributeRefGlobalInfo(var2, this.currentElemDecl, var3, var4, this.locator.getLineNumber()));
  502.       }
  503.  
  504.    }
  505.  
  506.    private void doGroupNode(AttributeList var1) {
  507.       if (this.cmClosed) {
  508.          this.error(this.currentElemDecl.getName(), 255, this.locator.getLineNumber(), this.locator.getColumnNumber());
  509.       }
  510.  
  511.       String var2 = null;
  512.       String var3 = null;
  513.       String var4 = null;
  514.  
  515.       for(int var5 = 0; var5 < var1.getLength(); ++var5) {
  516.          String var6 = var1.getName(var5);
  517.          if (var6.equals("minOccurs")) {
  518.             var2 = var1.getValue(var5);
  519.          } else if (var6.equals("maxOccurs")) {
  520.             var3 = var1.getValue(var5);
  521.          } else if (var6.equals("order")) {
  522.             var4 = var1.getValue(var5);
  523.          } else {
  524.             this.error(var6, 252, this.locator.getLineNumber(), this.locator.getColumnNumber());
  525.          }
  526.       }
  527.  
  528.       if (var4 == null) {
  529.          var4 = "seq";
  530.       }
  531.  
  532.       char var8 = this.getOccurance(var2, var3);
  533.       ContentModelTerm var7 = new ContentModelTerm();
  534.       var7.setOccurance(var8);
  535.       var7.setConnection(this.getCurrentConnection());
  536.       this.getCurrentParent().addTerm(var7);
  537.       this.contentModels.push(var7);
  538.       this.cmConnectors.push(this.getConnector(var4));
  539.       if (this.isFirstGroup) {
  540.          this.canDeleteFirstGroup = true;
  541.       } else if (this.groupLevel == 0) {
  542.          this.canDeleteFirstGroup = false;
  543.       }
  544.  
  545.       this.isFirstGroup = false;
  546.       ++this.groupLevel;
  547.    }
  548.  
  549.    private void doElementNode(AttributeList var1) {
  550.       if (this.cmClosed) {
  551.          this.error(this.currentElemDecl.getName(), 255, this.locator.getLineNumber(), this.locator.getColumnNumber());
  552.       }
  553.  
  554.       String var2 = null;
  555.       String var3 = null;
  556.       String var4 = null;
  557.  
  558.       for(int var5 = 0; var5 < var1.getLength(); ++var5) {
  559.          String var6 = var1.getName(var5);
  560.          if (var6.equals("type")) {
  561.             var2 = var1.getValue(var5);
  562.          } else if (var6.equals("minOccurs")) {
  563.             var3 = var1.getValue(var5);
  564.          } else if (var6.equals("maxOccurs")) {
  565.             var4 = var1.getValue(var5);
  566.          } else if (var6.indexOf(58) <= 0) {
  567.             this.error(var6, 252, this.locator.getLineNumber(), this.locator.getColumnNumber());
  568.          }
  569.       }
  570.  
  571.       if (var2 == null) {
  572.          var2 = new String("UNDEFINED");
  573.          this.error("element", 202, this.locator.getLineNumber(), this.locator.getColumnNumber());
  574.       }
  575.  
  576.       if (var2.indexOf(":") > 0) {
  577.          String var8 = var2.substring(0, var2.indexOf(":"));
  578.          var2.substring(var2.indexOf(":") + 1);
  579.          if (!this.namespaces.contains(var8)) {
  580.             this.error(String.valueOf(String.valueOf(var2).concat(String.valueOf(", "))).concat(String.valueOf(var8)), 242, this.locator.getLineNumber(), this.locator.getColumnNumber());
  581.          }
  582.       }
  583.  
  584.       this.addCPMetaProps(this.currentElemDecl, var2, var1);
  585.       char var9 = this.getOccurance(var3, var4);
  586.       ContentModelTerm var7 = this.getCurrentParent();
  587.       if (var7 == null && this.currentCM != null && this.currentCM.isAny()) {
  588.          this.currentCM.setContentModel(4);
  589.          var7 = this.currentCM.getRootGroup();
  590.          this.contentModels.push(var7);
  591.       }
  592.  
  593.       var7.addTerm(new ContentModelTerm(new TypeRef(var2), var9, this.getCurrentConnection()));
  594.       if (this.groupLevel == 0) {
  595.          this.canDeleteFirstGroup = false;
  596.       }
  597.  
  598.       this.isFirstGroup = false;
  599.    }
  600.  
  601.    private void doDatatypeNode(AttributeList var1) {
  602.       String var2 = null;
  603.  
  604.       for(int var3 = 0; var3 < var1.getLength(); ++var3) {
  605.          String var4 = var1.getName(var3);
  606.          if (var4.equals("dt:type")) {
  607.             var2 = var1.getValue(var3);
  608.          } else {
  609.             this.error(var4, 252, this.locator.getLineNumber(), this.locator.getColumnNumber());
  610.          }
  611.       }
  612.  
  613.       if (var2 == null) {
  614.          var2 = new String("string");
  615.          this.error("datatype", 258, this.locator.getLineNumber(), this.locator.getColumnNumber());
  616.       }
  617.  
  618.       if (this.currentAttrDecl != null) {
  619.          this.currentAttrDecl.setDataType(this.createDataType(var2));
  620.       } else if (this.currentElemDecl != null) {
  621.          this.currentElemDecl.setDataType(this.createDataType(var2));
  622.       } else {
  623.          this.error("datatype", 259, this.locator.getLineNumber(), this.locator.getColumnNumber());
  624.       }
  625.  
  626.    }
  627.  
  628.    private void doCommentNode(AttributeList var1) {
  629.       this.commentKind = null;
  630.  
  631.       for(int var2 = 0; var2 < var1.getLength(); ++var2) {
  632.          String var3 = var1.getName(var2);
  633.          if (var3.equals("usage")) {
  634.             this.commentKind = var1.getValue(var2);
  635.          } else {
  636.             this.error(var3, 252, this.locator.getLineNumber(), this.locator.getColumnNumber());
  637.          }
  638.       }
  639.  
  640.       if (this.commentKind == null) {
  641.          this.commentKind = new String("");
  642.       }
  643.  
  644.       ((BufferedHandlerBase)this).setSaveXML(true);
  645.       ((BufferedHandlerBase)this).clearSavedXML();
  646.    }
  647.  
  648.    public void parseElement(String var1, AttributeList var2) {
  649.       if (!this.gotSchemaRoot && !var1.equals("Schema")) {
  650.          this.error(var1, 260, this.locator.getLineNumber(), this.locator.getColumnNumber());
  651.          this.gotSchemaRoot = true;
  652.       }
  653.  
  654.       if (var1.equals("Schema")) {
  655.          this.gotSchemaRoot = true;
  656.          this.doSchemaNode(var2);
  657.       } else if (var1.equals("ElementType")) {
  658.          this.doElementTypeNode(var2);
  659.       } else if (var1.equals("AttributeType")) {
  660.          this.doAttributeTypeNode(var2);
  661.       } else if (var1.equals("attribute")) {
  662.          this.doAttributeNode(var2);
  663.       } else if (var1.equals("group")) {
  664.          this.doGroupNode(var2);
  665.       } else if (var1.equals("element")) {
  666.          this.doElementNode(var2);
  667.       } else if (var1.equals("datatype")) {
  668.          this.doDatatypeNode(var2);
  669.       } else if (var1.equals("description")) {
  670.          this.doCommentNode(var2);
  671.       } else if (this.getCurrentDecl() == null || var1.indexOf(58) < 0) {
  672.          this.error(var1, 239, this.locator.getLineNumber(), this.locator.getColumnNumber());
  673.       }
  674.  
  675.    }
  676.  
  677.    public void endElement(String var1) {
  678.       if (((BufferedHandlerBase)this).isSavingXML() && !var1.equals("description")) {
  679.          super.endElement(var1);
  680.       } else {
  681.          AttributeList var2 = (AttributeList)this.attrStack.pop();
  682.          if (var1.equals("ElementType")) {
  683.             if (this.canDeleteFirstGroup && this.currentElemDecl.getContentModel().getRootGroup() != null) {
  684.                ContentModelTerm var3 = this.currentElemDecl.getContentModel().getRootGroup().firstTerm();
  685.                this.currentElemDecl.getContentModel().removeTerm(this.currentElemDecl.getContentModel().getRootGroup());
  686.                this.currentElemDecl.getContentModel().addTerm(var3);
  687.             }
  688.  
  689.             ContentModel var6 = this.currentElemDecl.getContentModel();
  690.             if (var6 != null && var6.isMixed()) {
  691.                ContentModelTerm var4 = var6.getRootGroup();
  692.                if (var4 != null && var4.getOccurance() != '*' && var4.isGroup() && var4.getOwner() == this.currentElemDecl) {
  693.                   var4.setOccurance('*');
  694.                }
  695.             }
  696.  
  697.             this.schema.insertDeclaration(this.currentElemDecl, (BaseDeclaration)null);
  698.             this.currentElemDecl = null;
  699.             this.localAttrs.clear();
  700.             if (!this.contentModels.empty()) {
  701.                this.contentModels.removeAllElements();
  702.             }
  703.  
  704.             if (!this.cmConnectors.empty()) {
  705.                this.cmConnectors.removeAllElements();
  706.             }
  707.  
  708.             this.cmClosed = false;
  709.             this.isFirstGroup = false;
  710.          } else if (var1.equals("AttributeType")) {
  711.             this.schema.insertDeclaration(this.currentAttrDecl, (BaseDeclaration)null, this.currentElemDecl);
  712.             this.currentAttrDecl = null;
  713.          } else if (var1.equals("group")) {
  714.             --this.groupLevel;
  715.             if (!this.cmConnectors.empty()) {
  716.                this.cmConnectors.pop();
  717.             }
  718.  
  719.             if (!this.contentModels.empty()) {
  720.                this.contentModels.pop();
  721.             }
  722.          } else if (var1.equals("description")) {
  723.             ((BufferedHandlerBase)this).setSaveXML(false);
  724.             String var7 = ((BufferedHandlerBase)this).getSavedXML();
  725.             if (this.currentAttrDecl != null) {
  726.                this.currentAttrDecl.addComment(new Comment((String)this.commentKind, var7));
  727.             } else if (this.currentElemDecl != null) {
  728.                this.currentElemDecl.addComment(new Comment((String)this.commentKind, var7));
  729.             } else {
  730.                this.schema.addComment(new Comment((String)this.commentKind, var7));
  731.             }
  732.  
  733.             this.commentKind = null;
  734.             this.currentText.setLength(0);
  735.          } else if (var1.equals("Schema")) {
  736.             if (this.localAttrsRefGlobal.size() > 0) {
  737.                for(int var8 = 0; var8 < this.localAttrsRefGlobal.size(); ++var8) {
  738.                   AttributeRefGlobalInfo var9 = (AttributeRefGlobalInfo)this.localAttrsRefGlobal.elementAt(var8);
  739.                   if (this.globalAttrs.containsKey(var9.attrName)) {
  740.                      AttributeDeclaration var5 = (AttributeDeclaration)this.globalAttrs.get(var9.attrName);
  741.                      this.createLocalRefAttr(var5, var9, true);
  742.                   } else {
  743.                      this.currentElemDecl = var9.elementDecl;
  744.                      this.error(var9.attrName, 237, var9.linenumber, 0);
  745.                      this.currentElemDecl = null;
  746.                   }
  747.                }
  748.             }
  749.          } else if (var1.indexOf(58) >= 0) {
  750.             if (var1.indexOf("xmlns") != 0) {
  751.                if (var2.getLength() == 0) {
  752.                   this.appendMetaProp(this.getCurrentDecl(), var1, this.currentText.toString());
  753.                } else {
  754.                   this.addMetaProp(this.getCurrentDecl(), var1, var2);
  755.                }
  756.             }
  757.  
  758.             this.currentText.setLength(0);
  759.          }
  760.  
  761.          if (this.currentText.length() > 0) {
  762.             if (!StringUtilities.isWhitespace(this.currentText.toString())) {
  763.                this.error(this.currentText.toString(), 239, this.locator.getLineNumber(), this.locator.getColumnNumber());
  764.             }
  765.  
  766.             this.currentText.setLength(0);
  767.          }
  768.  
  769.       }
  770.    }
  771.  
  772.    private BaseDeclaration getCurrentDecl() {
  773.       if (this.currentElemDecl != null) {
  774.          return this.currentElemDecl;
  775.       } else {
  776.          return this.currentAttrDecl != null ? this.currentAttrDecl : null;
  777.       }
  778.    }
  779.  
  780.    public void characters(char[] var1, int var2, int var3) throws SAXException {
  781.       if (((BufferedHandlerBase)this).isSavingXML()) {
  782.          super.characters(var1, var2, var3);
  783.       } else {
  784.          this.currentText.append(var1, var2, var3);
  785.       }
  786.    }
  787.  
  788.    protected char getOccurance(Object var1, Object var2) {
  789.       char var3 = '\u0000';
  790.       var3 = '\u0000';
  791.       if (var1 == null) {
  792.          var1 = new String("1");
  793.       }
  794.  
  795.       if (var2 == null) {
  796.          var2 = new String("1");
  797.       }
  798.  
  799.       if (((String)var1).equals("1") && ((String)var2).equals("1")) {
  800.          var3 = '\u0000';
  801.       } else if (((String)var1).equals("0") && ((String)var2).equals("1")) {
  802.          var3 = '?';
  803.       } else if (((String)var1).equals("0") && ((String)var2).equals("*")) {
  804.          var3 = '*';
  805.       } else if (((String)var1).equals("1") && ((String)var2).equals("*")) {
  806.          var3 = '+';
  807.       } else {
  808.          this.error(String.valueOf(String.valueOf(String.valueOf("minOccurs=").concat(String.valueOf((String)var1))).concat(String.valueOf(", maxOccurs="))).concat(String.valueOf((String)var2)), 257, this.locator.getLineNumber(), this.locator.getColumnNumber());
  809.       }
  810.  
  811.       return var3;
  812.    }
  813.  
  814.    protected Character getConnector(Object var1) {
  815.       Character var2 = new Character(',');
  816.       if (((String)var1).equals("seq")) {
  817.          var2 = new Character(',');
  818.       } else if (((String)var1).equals("one")) {
  819.          var2 = new Character('|');
  820.       } else if (((String)var1).equals("many")) {
  821.          var2 = new Character('|');
  822.       } else {
  823.          this.error((String)var1, 261, this.locator.getLineNumber(), this.locator.getColumnNumber());
  824.       }
  825.  
  826.       return var2;
  827.    }
  828.  
  829.    private void doIntro(AttributeList var1) {
  830.       ((BufferedHandlerBase)this).setSaveXML(true);
  831.       ((BufferedHandlerBase)this).clearSavedXML();
  832.    }
  833. }
  834.